<?php

class App
{
    public function __construct()
    {
        $this->route();
    }

    private function route()
    {
        $segment = $this->splitUrl();
        $filePath = PAGE_PATH . $segment[0] . '.md';
        if (isset($segment[1])) {
            $filePath = PAGE_PATH . $segment[0] . '/' . $segment[1] . '.md';
        }

        // echo '<pre>';
        // var_dump($segment);
        // die();

        if (!is_file($filePath)) {
            self::notFound();
        }

        // 检查文件是否存在且为PHP文件
        if (file_exists($filePath) && pathinfo($filePath, PATHINFO_EXTENSION) === 'md') {
            return self::render($filePath);
        }
    }

    public static function fileList()
    {
        $pathArray = self::pagePaths();

        echo '<ul class="list">';
        foreach ($pathArray as $item) {
            echo '<li><a href=' . $item . '>' . substr($item, 1) . '</a></li>';
        }
        echo '</ul>';
    }

    private function splitUrl()
    {
        // 获取路径参数
        if (isset($_GET['path'])) {
            $url = trim($_GET['path'], '/');
            $url = filter_var($url, FILTER_SANITIZE_URL);
            $url = preg_replace('/[^a-zA-Z0-9\-\/]/', '', $url);
            unset($_GET['path']);
        } else {
            $url = DEFAULT_PAGE;
        }

        $router = explode('/', $url);

        if (empty($router[0])) {
            array_shift($router);
        }

        $router[0] = isset($router[0]) ?  $router[0] : DEFAULT_PAGE;
        // $router[1] = isset($router[1]) ?  $router[1] : DEFAULT_PAGE;

        return $router;
    }

    /**
     * 解析 md 文件
     */
    private static function parsedown(string $filePath)
    {
        require_once 'Parsedown.php';
        $parsedown = new Parsedown();

        $file = file_get_contents($filePath);
        $parsedown->setSafeMode(true);

        return $parsedown->text($file);
    }

    private static function render($filePath)
    {
        include_once VIEW_PATH . '_header.php';
        echo self::parsedown($filePath);
        include_once VIEW_PATH . '_footer.php';
    }

    private static function notFound()
    {
        // 文件不存在或不是PHP文件时返回404错误
        http_response_code(404);
        header('HTTP/1.0 404 Not Found');
        include_once CORE_PATH . 'template/404.php';
        exit();
    }

    public static function pagePaths()
    {
        $files = self::listFiles();

        if ($files !== false) {
            // 替换分隔符为 /
            $files = array_map(function ($item) {
                $item = substr($item, 0, -3);
                return str_replace('\\', '/', $item);
            }, $files);

            $pagesPaths = [];

            foreach ($files as $path) {
                // 找到 '/pages/' 在路径中的位置
                $pagesPosition = strpos($path, '/pages/');
                // 如果找到了 '/pages/'
                if ($pagesPosition !== false) {
                    // 从 '/pages/' 之后开始截取字符串
                    $relativePath = substr($path, $pagesPosition + strlen('/pages/'));

                    // 添加到结果数组中
                    $pagesPaths[] = $relativePath;
                }
            }

            return $pagesPaths;
        }
    }

    private static function listFiles($dir = PAGE_PATH, &$files = [])
    {
        // 确保目录存在并且是目录
        if (!is_dir($dir)) {
            return false;
        }

        // 打开目录
        $dirHandle = @opendir($dir);
        if (!$dirHandle) {
            return false;
        }

        // 遍历目录中的文件和子目录
        while (false !== ($file = readdir($dirHandle))) {
            // 跳过当前目录（"."）和上级目录（".."）
            if ($file == "." || $file == "..") {
                continue;
            }

            // 构建完整的文件路径
            $filePath = $dir . '/' . $file;

            // 如果是目录，则递归调用listFiles函数
            if (is_dir($filePath)) {
                self::listFiles($filePath, $files);
            } else {
                // 如果是文件，则添加到文件数组中
                $files[] = $filePath;
            }
        }

        // 关闭目录句柄
        closedir($dirHandle);

        return $files;
    }
}
